package com.codes.core.utils.word;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description 之前使用的 xml 转 ftl  生成 word   (暂时不用)
 * @Date 2020/6/30 20:33
 * @Created by peanut
 */
public class FreeMarkUtils {


    private static Configuration cfg = null;
    private static String DEFAULT_ENCODING = "UTF-8";
    private static final String templateFolder = FreeMarkUtils.class.getResource("/template/word").getPath();
    static {
        cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        cfg.setDefaultEncoding(DEFAULT_ENCODING);
    }

    public static String buildStr(String tempDir, List<String> params) {
        String result = null;
        StringWriter sw = null;
        try {
            sw = new StringWriter();
            // 加载模板文件
            if (StringUtils.isBlank(tempDir)) {
                throw new RuntimeException("模板文件路径不能为空");
            }
            loadFileTemplate(tempDir);
            // 拼接word
            for (String param : params) {
                appendFtl(sw, param);
            }
            // 转string
            result = sw.toString();
        } catch (Exception ex) {
            throw dealException(ex);
        } finally {
            try {
                if (sw != null) {
                    sw.flush();
                    sw.close();
                }
            } catch (Exception ex) {
                // 暂不处理
            } finally {
                sw = null;
            }
        }
        return result;
    }

    /**
     * 导出excel文件
     * @param templateDir 模板路径
     * @param templateName 模板名称
     * @param excelPath 导出的文件路径
     * @param data 数据
     * @throws IOException
     * @throws TemplateException
     */
    public static void parse(String templateDir, String templateName, String excelPath, Map<String, Object> data) {
        // 初始化流
        OutputStreamWriter writer = null;
        // 初始化配置
        Configuration cfg = new Configuration( Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        // 设置默认编码格式为UTF-8
        cfg.setDefaultEncoding(DEFAULT_ENCODING);
        // 全局数字格式
        cfg.setNumberFormat("0.00");
        try {
            // 设置模板文件位置
            cfg.setDirectoryForTemplateLoading(new File(templateDir));
            cfg.setObjectWrapper(new DefaultObjectWrapper());
            // 加载模板
            Template template = cfg.getTemplate(templateName, DEFAULT_ENCODING);
            // 填充数据至Excel
            writer = new OutputStreamWriter(new FileOutputStream(excelPath), DEFAULT_ENCODING);
            template.process(data, writer);
            writer.flush();
        }  catch (IOException | TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建word文件
     * @param destPath 生成文件全路径
     * @param tempDir ftl文件夹路径
     * @param params 文件名和文件替换参数
     */
    public static File buildWord(String destPath, String tempDir, List<String> params) {
        PrintWriter pw = null;
        destPath = "test.doc";
        tempDir = templateFolder;
        // 创建文件路径
        File file = new File(destPath);
        try {
            // 创建目标文件流
            if (StringUtils.isBlank(destPath)) {
                throw new RuntimeException("生成文件路径不能为空");
            }

//            if (!file.getParentFile().exists()) {
//                if(!file.getParentFile().mkdirs()) {
//                    throw new RuntimeException("创建文件路径失败");
//                }
//            }
            // 创建文件流
        //    pw = new PrintWriter(new FileOutputStream(file,true), DEFAULT_ENCODING);
            pw = new PrintWriter(new FileOutputStream(file,true), true);
            // 加载模板文件
            if (StringUtils.isBlank(tempDir)) {
                throw new RuntimeException("模板文件路径不能为空");
            }
            loadFileTemplate(tempDir);
            // 拼接word
            for (String param : params) {
                appendFtl(pw, param);
            }
        } catch (Exception ex) {
            throw dealException(ex);
        } finally {
            try {
                if (pw != null) {
                    pw.flush();
                    pw.close();
                }
            } catch (Exception ex) {
                // 暂不处理
            } finally {
                pw = null;
            }
        }
        return  file;
    }

    /**
     * 拼接模板文件
     * @param pw
     * @param param
     */
    private static void appendFtl(Writer pw, String param) {
        try {
            // 读取模板文件
            Template template = cfg.getTemplate(param );
            Map<String,Object> map = new HashMap<>(19);
            map.put("id",1001);
            // 写入文件
            template.process(map, pw);
        } catch (Exception ex) {
            throw dealException(ex);
        }
    }

    /**
     * 加载模板文件
     * @param
     */
    private static void loadFileTemplate(String tempDir) {
        try {
            // 加载模板文件
            FileTemplateLoader loader = new FileTemplateLoader(new File(tempDir));

            TemplateLoader[] loaders = { loader };

            MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

            // 读取模板
            cfg.setTemplateLoader(mtl);
            cfg.setDefaultEncoding(DEFAULT_ENCODING);
        } catch (Exception ex) {
            throw dealException(ex);
        }
    }

    /**
     * 调用异常处理
     * @param ex
     * @return
     */
    private static RuntimeException dealException(Exception ex) {
        if (ex == null) {
            return null;
            //  } else if (ex instanceof AxisFault) {
            //   if (ex.getCause() instanceof SocketTimeoutException) { // 调用超时
            //    return new ServiceInterruptedException(ex.getCause());
            //   } else if (ex.getCause() instanceof ConnectTimeoutException) { // 连接超时
            //    // 暂不作特殊处理
            //    return new RuntimeException(ex);
            //   } else {
            //    return new RuntimeException(ex);
            //   }
        } else {
            return new RuntimeException(ex);
        }
    }

//
//    private static Logger logger = LoggerFactory.getLogger(FreeMarkUtils.class);
//
//    public static Configuration getConfiguration() {
//        // 创建配置实例
//        Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
//        // 设置编码
//        configuration.setDefaultEncoding("utf-8");
//        configuration.setClassForTemplateLoading(FreeMarkUtils.class, "/template/word");// 换成自己对应的目录
//        return configuration;
//    }
//
//    /**
//     * 获取模板字符串输入流
//     *
//     * @param dataMap
//     *            参数
//     * @param templateName
//     *            模板名称
//     * @return
//     */
//    public static ByteArrayInputStream getFreemarkerContentInputStream(Map<String, Object> dataMap,
//                                                                       String templateName) {
//        ByteArrayInputStream in = null;
//        try {
//            // 获取模板
//            Template template = getConfiguration().getTemplate(templateName);
//            StringWriter swriter = new StringWriter();
//            // 生成文件
//            template.process(dataMap, swriter);
//
//            in = new ByteArrayInputStream(swriter.toString().getBytes("utf-8"));// 这里一定要设置utf-8编码
//            // 否则导出的word中中文会是乱码
//        } catch (Exception e) {
//            logger.error("", e);
//        }
//        return in;
//    }
//
//    public static void createDocx(Map<String, Object> dataMap, OutputStream outputStream, String zipPath,String templateName) {
//        ZipOutputStream zipout = null;
//        try {
//            /*
//             * //图片配置文件模板 ByteArrayInputStream documentXmlRelsInput =
//             * FreeMarkUtils.getFreemarkerContentInputStream(dataMap,
//             * documentXmlRels);
//             */
//
//            // 内容模板
//            ByteArrayInputStream documentInput = FreeMarkUtils.getFreemarkerContentInputStream(dataMap, templateName);
//            // 最初设计的模板
//            // File docxFile = new
//            // File(WordUtils.class.getClassLoader().getResource(template).getPath());
//            File docxFile = new File(zipPath);// 换成自己的zip路径
//            if (!docxFile.exists()) {
//                docxFile.createNewFile();
//            }
//            @SuppressWarnings("resource")
//            ZipFile zipFile = new ZipFile(docxFile);
//            Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();
//            zipout = new ZipOutputStream(outputStream);
//            // 开始覆盖文档------------------
//            int len = -1;
//            byte[] buffer = new byte[1024];
//            while (zipEntrys.hasMoreElements()) {
//                ZipEntry next = zipEntrys.nextElement();
//                InputStream is = zipFile.getInputStream(next);
//                if (next.toString().indexOf("media") < 0) {
//                    zipout.putNextEntry(new ZipEntry(next.getName()));
//                    if ("word/document.xml".equals(next.getName())) {// 如果是word/document.xml由我们输入
//                        if (documentInput != null) {
//                            while ((len = documentInput.read(buffer)) != -1) {
//                                zipout.write(buffer, 0, len);
//                            }
//                            documentInput.close();
//                        }
//                    } else {
//                        while ((len = is.read(buffer)) != -1) {
//                            zipout.write(buffer, 0, len);
//                        }
//                        is.close();
//                    }
//                }
//            }
//
//        } catch (Exception e) {
//            System.out.println("word导出失败:" + e.getStackTrace());
//            logger.error("TET", e);
//        } finally {
//            if (zipout != null) {
//                try {
//                    zipout.close();
//                } catch (IOException e) {
//                    System.out.println("io异常");
//
//                }
//            }
//            if (outputStream != null) {
//                try {
//                    outputStream.close();
//                } catch (IOException e) {
//                    System.out.println("io异常");
//                }
//            }
//        }
//    }
//
//    // 两个对象进行追加
//    public static XWPFDocument mergeWord(XWPFDocument document, XWPFDocument doucDocument2) throws Exception {
//        XWPFDocument src1Document = document;
//        XWPFParagraph p = src1Document.createParagraph();
//        // 设置分页符
//        p.setPageBreak(true);
//        CTBody src1Body = src1Document.getDocument().getBody();
//        XWPFDocument src2Document = doucDocument2;
//        CTBody src2Body = src2Document.getDocument().getBody();
//        // XWPFParagraph p2 = src2Document.createParagraph();
//        XmlOptions optionsOuter = new XmlOptions();
//        optionsOuter.setSaveOuter();
//        String appendString = src2Body.xmlText(optionsOuter);
//        String srcString = src1Body.xmlText();
//        String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
//        String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
//        String sufix = srcString.substring(srcString.lastIndexOf("<"));
//        String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
//        CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
//        src1Body.set(makeBody);
//        return src1Document;
//    }

}